package com.example.untils;

import java.util.List;

import org.apdplat.word.WordSegmenter;
import org.apdplat.word.analysis.Similarity;
import org.apdplat.word.analysis.SimpleTextSimilarity;
import org.apdplat.word.dictionary.DictionaryFactory;
import org.apdplat.word.segmentation.SegmentationAlgorithm;
import org.apdplat.word.segmentation.Word;
import org.apdplat.word.util.WordConfTools;

/**
 * 
 * word分词器 工具类
 * 
 * @author lli
 *
 * @version 1.0
 * 
 */
public class WordSegmenterUtil {
    /**
     * 
     * @description 移除停用词
     * @author lli
     * @create 2017年4月13日上午10:13:10
     * @version 1.0
     * @param str
     * @return
     */
    public static List<Word> seg(final String str) {
        List<Word> words = WordSegmenter.seg(str);
        return words;
    }

    /**
     * 
     * @description 保留停用词
     * @author lli
     * @create 2017年4月13日上午10:13:10
     * @version 1.0
     * @param str
     * @return
     */
    public static List<Word> segWithStopWords(final String str) {
        List<Word> words = WordSegmenter
                .segWithStopWords(str);
        return words;
    }

    /**
     * 
     * @description 移除停用词
     * @author lli
     * @create 2017年4月13日上午10:13:10
     * @version 1.0
     * @param str
     * @return
     */
    public static List<Word> segAndDic(final String str) {
        // 第一个是系统自带的词库，额外加自己的可以配置第二个my
        // 停词库类似stopwords.path
        WordConfTools.set("dic.path", "classpath:dic.txt，classpath:my.txt");
        DictionaryFactory.reload();// 更改词典路径之后，重新加载词典
        List<Word> words = WordSegmenter.seg(str);
        return words;
    }

    /**
     * 
     * @description 对文本进行分词时，可显式指定特定的分词算法
     * @author lli
     * @create 2017年4月13日上午10:13:10
     * @version 1.0
     * @param str
     * @return
     */
    public static List<Word> segWithSegmentationAlgorithm(final String str,
            final SegmentationAlgorithm segmentationAlgorithm) {
        List<Word> words = WordSegmenter.seg(str, segmentationAlgorithm);
        return words;
    }

    /**
     * 
     * @description 计算2个字符串相似度
     * @author lli
     * @create 2017年4月13日上午10:31:22
     * @version 1.0
     * @param text1
     * @param text2
     * @return
     */
    public static double match(final String text1, final String text2) {
        // 编辑距离
        Similarity textSimilarity = new SimpleTextSimilarity();
        // 余弦相似度，通过计算两个向量的夹角余弦值来评估他们的相似度
        // TextSimilarity textSimilarity = new CosineTextSimilarity();
        // 简单共有词，通过计算两篇文档共有的词的总字符数除以最长文档字符数来评估他们的相似度
        // TextSimilarity textSimilarity = new SimpleTextSimilarity();
        //
        double score = textSimilarity.similarScore(text1, text2);
        return score;
    }

}
